#include "UdpClient.hpp"


using namespace LogArea;

int main(int argc,char* argv[])
{
    if(argc!=3)
    {
        LOG(LogLevel::ERROR)<<"Usage error, argc should be: 3";
        Die(USAGE_ERR);
    }

    std::string serverip = argv[1]; //IP地址
    uint16_t serverport = std::stoi(argv[2]); //服务器端口号

    int sockfd = ::socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd<0)
    {
        LOG(LogLevel::FATALER)<<"socket error: "<<strerror(errno);
        Die(SOCKET_ERR);
    }


    //填充 server 信息,用于后面 recvfrom 与服务器通信
    struct sockaddr_in server;
    memset(&server,0,sizeof(server));   //将 server 结构体中内容清空
    server.sin_family = AF_INET;
    server.sin_port = ::htons(serverport);
    server.sin_addr.s_addr = ::inet_addr(serverip.c_str());     //将服务器 ip 地址从网络转为主机



    while(true)
    {
        std::cout<<"Please Enter: ";
        std::string message;
        std::getline(std::cin,message);

        //向服务器发送消息
        ssize_t n = ::sendto(sockfd,message.c_str(),message.size(),0,CONV(&server),sizeof(server));
        (void)n;

        struct sockaddr_in temp;
        socklen_t len = sizeof(temp);
        char buffer[1024];
        //用于接受从服务器反馈回来的消息，并将服务器地址信息存储在temp中
        n = ::recvfrom(sockfd,buffer,sizeof(buffer)-1,0,CONV(&temp),&len);

        if(n>0)
        {
            buffer[n] = 0;
            std::cout<<buffer<<std::endl;
        }
    }

    
    return 0;
}